package com.z.redis.util;


/**
 * TRACEID 类通过 ThreadLocal 和唯一ID生成器实现分布式追踪功能
 * 适用于日志跟踪、性能监控等场景。需注意内存泄漏和ID传递的可靠性问题。
 * 为 Redis 服务端提供线程安全的请求跟踪 ID 管理，支持日志追踪和调试
 */
public class TRACEID {
    private static final ThreadLocal<String> THREAD_LOCAL_TRACEID = new ThreadLocal<>(); // 线程本地变量，用于存储当前线程的 TRACEID
    // 确保每个线程都有独立的跟踪ID 避免多线程冲突

    private static final Uid uid = WinterId.instance(); // 唯一ID 用于日志追踪和请求链路跟踪

    // 获取当前跟踪ID
    public static String currentTraceId() {
        String traceId = THREAD_LOCAL_TRACEID.get(); // 获得ID
        if (traceId == null) {
            return newTraceid(); // 没有就创建一个
        } else {
            return traceId; // 返回绑定的ID
        }
    }

    // 生成新跟踪ID
    public static String newTraceid() {
        String traceId = uid.generate(); // 生成ID
        THREAD_LOCAL_TRACEID.set(traceId);
        return traceId;
    }

    // 绑定外部ID
    public static void bind(String traceId) {
        THREAD_LOCAL_TRACEID.set(traceId); // 将外部ID绑定到当前线程
    }
}
